home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / lib / ubiquity / user-setup / user-setup-apply < prev    next >
Text File  |  2009-10-28  |  10KB  |  329 lines

  1. #! /bin/bash
  2. set -e
  3.  
  4. . /usr/share/debconf/confmodule
  5.  
  6. if [ "$1" ]; then
  7.     export LANG=C # avoid locale errors from perl
  8.     ROOT="$1"
  9.     chroot=chroot
  10.     log='log-output -t user-setup'
  11. else
  12.     ROOT=
  13.     chroot=
  14.     log=
  15. fi
  16.  
  17. . /usr/lib/ubiquity/user-setup/functions.sh
  18.  
  19. # Set a password, via chpasswd.
  20. # Use a heredoc rather than echo, to avoid the password
  21. # showing in the process table. (However, this is normally
  22. # only called when first installing the system, when root has no
  23. # password at all, so that should be an unnecessary precaution).
  24. #
  25. # Pass in four arguments: the user, the password, 'true' if the
  26. # password has been pre-crypted (by preseeding), and a 'true' if
  27. # the home directory is encrypted
  28. setpassword () {
  29.     local USER PASSWD PAM_SET_PWD
  30.     USER="$1"
  31.     PASSWD="$2"
  32.  
  33.     local VERSION=$($chroot $ROOT dpkg-query -W -f '${Version}\n' passwd)
  34.     PAM_SET_PWD=false
  35.     if $chroot $ROOT dpkg --compare-versions "$VERSION" ge "1:4.1.4-1"; then
  36.         # support for versions with PAM support (Squeeze)
  37.         PAM_SET_PWD=true
  38.         if [ "$3" = true ]; then
  39.             $chroot $ROOT usermod --password=$PASSWD $USER
  40.         else
  41.             $chroot $ROOT chpasswd <<EOF
  42. $USER:$PASSWD
  43. EOF
  44.         fi
  45.     else
  46.         # compatibility support for versions without PAM support (Lenny)
  47.         local OPTS
  48.         if [ "$3" = true ]; then
  49.             OPTS=-e
  50.         else
  51.             OPTS=-m
  52.         fi
  53.         $chroot $ROOT chpasswd $OPTS <<EOF
  54. $USER:$PASSWD
  55. EOF
  56.     fi
  57.     # If the password was set using PAM, pam_ecryptfs will handle the initial
  58.     # passphrase wrapping.  Otherwise, we need this hack...
  59.     if [ "$4" = true ] && [ "$PAM_SET_PWD" = false ]; then
  60.         local UNWRAPPED_PASSPHRASE_FILE WRAPPED_PASSPHRASE_FILE MOUNT_PASSPHRASE
  61.         UNWRAPPED_PASSPHRASE_FILE=/dev/shm/.ecryptfs-$USER
  62.         if [ -e "$UNWRAPPED_PASSPHRASE_FILE" ]; then
  63.             WRAPPED_PASSPHRASE_FILE=/home/$USER/.ecryptfs/wrapped-passphrase
  64.             MOUNT_PASSPHRASE=$($chroot $ROOT cat $UNWRAPPED_PASSPHRASE_FILE)
  65.             $chroot $ROOT ecryptfs-wrap-passphrase $WRAPPED_PASSPHRASE_FILE - <<EOF
  66. $MOUNT_PASSPHRASE
  67. $PASSWD
  68. EOF
  69.             $chroot $ROOT rm -f $UNWRAPPED_PASSPHRASE_FILE
  70.             $chroot $ROOT chown $USER:$USER $WRAPPED_PASSPHRASE_FILE
  71.         else
  72.             echo "$UNWRAPPED_PASSPHRASE_FILE does not exist, but should!" >&2
  73.             db_input critical user-setup/encrypt-home-failed || true
  74.             db_go || true
  75.         fi
  76.     fi
  77. }
  78.  
  79. # Enable/disable shadow passwords.
  80. db_get passwd/shadow
  81. if [ "$RET" = true ]; then
  82.     $log $chroot $ROOT shadowconfig on
  83. else
  84.     $log $chroot $ROOT shadowconfig off
  85. fi
  86.  
  87. if ! root_password; then
  88.     # Was the root password preseeded encrypted?
  89.     if db_get passwd/root-password-crypted && [ "$RET" ]; then
  90.         # The root password was preseeded encrypted.
  91.         ROOT_PW="$RET"
  92.         PRECRYPTED=true
  93.     else
  94.         db_get passwd/root-password
  95.         ROOT_PW="$RET"
  96.         PRECRYPTED=false
  97.     fi
  98.     # Clear the root password from the database, and set the password.
  99.     db_set passwd/root-password-crypted ''
  100.     db_set passwd/root-password ''
  101.     db_set passwd/root-password-again ''
  102.     if [ "$ROOT_PW" ]; then
  103.         setpassword root "$ROOT_PW" "$PRECRYPTED"
  104.     fi
  105.     ROOT_PW=
  106. else
  107.     # Just in case, clear any preseeded root password from the database
  108.     # anyway.
  109.     db_set passwd/root-password-crypted ''
  110.     db_set passwd/root-password ''
  111.     db_set passwd/root-password-again ''
  112. fi
  113.  
  114. db_get passwd/make-user
  115. if [ "$RET" = true ] && ! is_system_user; then
  116.     if db_get passwd/user-password-crypted && [ "$RET" ]; then
  117.         USER_PW="$RET"
  118.         USER_PW_CRYPTED=true
  119.     else
  120.         db_get passwd/user-password
  121.         USER_PW="$RET"
  122.         USER_PW_CRYPTED=false
  123.     fi
  124.  
  125.     if db_get passwd/user-uid && [ "$RET" ]; then
  126.         if [ -x $ROOT/usr/sbin/adduser ]; then
  127.             UIDOPT="--uid $RET"
  128.         else
  129.             UIDOPT="-u $RET"
  130.         fi
  131.     else
  132.         UIDOPT=
  133.     fi
  134.  
  135.     ENCRYPT_HOME="false"
  136.     ENCRYPT_HOME_OPT=
  137.     db_get user-setup/encrypt-home
  138.     if [ "$RET" = true ]; then
  139.         ENCRYPT_HOME="true"
  140.         ENCRYPT_HOME_OPT="--encrypt-home"
  141.         if type anna-install >/dev/null 2>&1 && [ -d /lib/debian-installer ]; then
  142.             ANNA_QUIET=1 DEBIAN_FRONTEND=none $log anna-install crypto-modules || true
  143.             depmod -a >/dev/null 2>&1 || true
  144.         fi
  145.         for module in aes cbc ecb; do
  146.             modprobe -q "$module" || true
  147.         done
  148.         
  149.         umountproc=false
  150.         umountdev=false
  151.         if [ ! -e $ROOT/proc/cmdline ]; then
  152.             $log $chroot $ROOT mount -t proc proc /proc
  153.             umountproc=:
  154.         fi
  155.         if [ ! -e $ROOT/dev/null ]; then
  156.             mount --bind /dev $ROOT/dev
  157.             umountdev=:
  158.         fi
  159.         if ! $log $chroot $ROOT ecryptfs-setup-swap -f -n; then
  160.             echo "ecryptfs-setup-swap failed." >&2
  161.             db_input critical user-setup/encrypt-home-failed || true
  162.             db_go || true
  163.             ENCRYPT_HOME="false"
  164.             ENCRYPT_HOME_OPT=
  165.         fi
  166.         if $umountproc; then
  167.             $log $chroot $ROOT umount /proc
  168.         fi
  169.         if $umountdev; then
  170.             umount $ROOT/dev
  171.         fi
  172.     fi
  173.  
  174.  
  175.     # Add the user to the database, using adduser in noninteractive
  176.     # mode.
  177.     db_get passwd/username
  178.     USER="$RET"
  179.     db_get passwd/user-fullname
  180.  
  181.     HOME_EXISTED=
  182.     if [ -d "$ROOT/home/$USER" ]; then
  183.         HOME_EXISTED=1
  184.         # user-setup-ask shouldn't have allowed this, but for safety:
  185.         ENCRYPT_HOME="false"
  186.         ENCRYPT_HOME_OPT=
  187.     fi
  188.  
  189.     umountsys=false
  190.     if [ -n "$ENCRYPT_HOME_OPT" ]; then
  191.         if [ ! -e $ROOT/sys/kernel ]; then
  192.             $log $chroot $ROOT mount -t sysfs sysfs /sys
  193.             umountsys=:
  194.         fi
  195.         $log $chroot $ROOT mount -t tmpfs tmpfs /dev/shm
  196.     fi
  197.     if [ -x $ROOT/usr/sbin/adduser ]; then
  198.         $log $chroot $ROOT adduser --disabled-password --gecos "$RET" $UIDOPT $ENCRYPT_HOME_OPT "$USER" >/dev/null || true
  199.     else
  200.         $log $chroot $ROOT useradd -c "$RET" -m "$USER" $UIDOPT >/dev/null || true
  201.     fi
  202.  
  203.     # Clear the user password from the database.
  204.     db_set passwd/user-password-crypted ''
  205.     db_set passwd/user-password ''
  206.     db_set passwd/user-password-again ''
  207.     setpassword "$USER" "$USER_PW" "$USER_PW_CRYPTED" "$ENCRYPT_HOME"
  208.     if [ -n "$ENCRYPT_HOME_OPT" ]; then
  209.         if $umountsys; then
  210.             $log $chroot $ROOT umount /sys
  211.         fi
  212.         $log $chroot $ROOT umount /dev/shm
  213.     fi
  214.  
  215.     if [ "$HOME_EXISTED" ]; then
  216.         # The user's home directory already existed before we called
  217.         # adduser. This often means that a mount point under
  218.         # /home/$USER was selected in (and thus created by) partman,
  219.         # and the home directory may have ended up owned by root.
  220.         $log $chroot $ROOT chown "$USER:$USER" "/home/$USER" >/dev/null || true
  221.     fi
  222.  
  223.     if [ -n "$USER" ]; then
  224.         for group in lpadmin sambashare; do
  225.             $log $chroot $ROOT addgroup --system $group >/dev/null 2>&1 || true
  226.         done
  227.         if type archdetect >/dev/null 2>&1; then
  228.             SUBARCH="$(archdetect)"
  229.             case $SUBARCH in
  230.                 powerpc/ps3|powerpc/cell)
  231.                     $log $chroot $ROOT addgroup --system spu >/dev/null 2>&1 || true
  232.                     ;;
  233.             esac
  234.         fi
  235.         db_get passwd/user-default-groups
  236.         for group in $RET; do
  237.             $log $chroot $ROOT adduser "$USER" $group >/dev/null 2>&1 || true
  238.         done
  239.  
  240.          # Configure desktop auto-login if instructed by preseeding
  241.          db_get passwd/auto-login
  242.          if [ "$RET" = true ]; then
  243.             db_get passwd/auto-login-backup
  244.             BACKUP="${RET:+.$RET}"
  245.  
  246.             if [ -d "$ROOT/etc/gdm" ]; then
  247.                 # Configure GDM autologin
  248.                 if [ -e "$ROOT/etc/gdm/custom.conf" ] && [ "$BACKUP" ]; then
  249.                     mv "$ROOT/etc/gdm/custom.conf" "$ROOT/etc/gdm/custom.conf$BACKUP"
  250.                 fi
  251.                 cat > $ROOT/etc/gdm/custom.conf <<EOF
  252. [daemon]
  253. AutomaticLoginEnable=true
  254. AutomaticLogin=$USER
  255. TimedLoginEnable=true
  256. TimedLogin=$USER
  257. TimedLoginDelay=10
  258. EOF
  259.             fi
  260.      
  261.             if $chroot $ROOT [ -f /etc/kde4/kdm/kdmrc ]; then
  262.                 # Configure KDM autologin
  263.                 $log $chroot $ROOT sed -i$BACKUP -r \
  264.                     -e "s/^#?AutoLoginEnable=.*\$/AutoLoginEnable=true/" \
  265.                     -e "s/^#?AutoLoginUser=.*\$/AutoLoginUser=$USER/" \
  266.                     -e "s/^#?AutoReLogin=.*\$/AutoReLogin=true/" \
  267.                     /etc/kde4/kdm/kdmrc
  268.             fi
  269.         fi
  270.     fi
  271.  
  272.     db_get passwd/root-login
  273.     if [ "$RET" = false ] && [ -n "$USER" ]; then
  274.         # Ensure sudo is installed, and set up the user to be able
  275.         # to use it.
  276.         if [ ! -e $ROOT/etc/sudoers ]; then
  277.             # try to work in d-i and out; it's better to
  278.             # use apt-install in d-i
  279.             apt-install sudo 2>/dev/null || $log $chroot $ROOT apt-get -q -y install sudo || true
  280.         fi
  281.         if [ -e $ROOT/etc/sudoers ]; then
  282.             $log $chroot $ROOT addgroup --system admin >/dev/null 2>&1 || true
  283.             $log $chroot $ROOT adduser "$USER" admin >/dev/null 2>&1 || true
  284.             cat <<EOF >>$ROOT/etc/sudoers
  285.  
  286. # Members of the admin group may gain root privileges
  287. %admin ALL=(ALL) ALL
  288. EOF
  289.         else
  290.             # sudo failed to install, system won't be usable
  291.             exit 1
  292.         fi
  293.         # Configure gksu to use sudo, via an alternative, if it's
  294.         # installed and the alternative is registered.
  295.         if $chroot $ROOT update-alternatives --display libgksu-gconf-defaults >/dev/null 2>&1; then
  296.             $log $chroot $ROOT update-alternatives --set libgksu-gconf-defaults /usr/share/libgksu/debian/gconf-defaults.libgksu-sudo
  297.             $log $chroot $ROOT update-gconf-defaults || true
  298.         fi
  299.     else
  300.         # Configure gksu to use su, via an alternative, if it's
  301.         # installed and the alternative is registered.
  302.         if $chroot $ROOT update-alternatives --display libgksu-gconf-defaults >/dev/null 2>&1; then
  303.             $log $chroot $ROOT update-alternatives --set libgksu-gconf-defaults /usr/share/libgksu/debian/gconf-defaults.libgksu-su
  304.             $log $chroot $ROOT update-gconf-defaults || true
  305.         fi
  306.     fi
  307.     if [ -n "$ENCRYPT_HOME_OPT" ] && [ -e $ROOT/etc/crypttab ]; then
  308.         # Zero out all encrypted swap partitions.  It is assumed that
  309.         # passwords are not used beyond this point in the install.
  310.         # cryptswap0 /dev/sda5 /dev/urandom swap,cipher=aes-cbc-essiv:sha256
  311.         while read name device source options; do
  312.             if echo "$options" | grep -q "swap"; then
  313.                 if swapoff $device; then
  314.                     dd if=/dev/zero of=$device 2>/dev/null || true
  315.                 fi
  316.             fi
  317.         done < $ROOT/etc/crypttab
  318.     fi
  319.  
  320. else
  321.     # Just in case, clear any preseeded user password from the database
  322.     # anyway.
  323.     db_set passwd/user-password-crypted ''
  324.     db_set passwd/user-password ''
  325.     db_set passwd/user-password-again ''
  326. fi
  327.  
  328. exit 0
  329.